package cn.exrick.service;

import java.util.List;
import java.util.Map;

import cn.exrick.pojo.BasePojo;
import cn.exrick.utils.mybatis.Criteria;
import cn.exrick.utils.mybatis.Page;
import cn.exrick.utils.mybatis.PageParam;

public interface BaseService<T extends BasePojo> {
    /**
     * 通过主键查询
     *
     * @param id
     * @return
     */
    T findById(long id);

    /**
     * 查询List
     *
     * @return
     */
    List<T> findList(Map<String, Object> params);

    /**
     * 统计个数
     * @param params
     * @return
     */
    int countList(Map<String, Object> params);

    /**
     * 通过criteria查询List
     *
     * @return
     */
    List<T> findListByCriteria(Criteria criteria, PageParam pageParam);

    /**
     * 通过criteria统计List
     *
     * @return
     */
    int countListByCriteria(Criteria criteria);

    /**
     * 获取所有
     *
     * @return
     */
    List<T> findAll();

    /**
     * 保存
     *
     * @param t
     * @return
     */
    long save(T t);

    /**
     * 更新
     *
     * @param t
     * @return
     */
    boolean update(T t);

    /**
     * 删除
     *
     * @param t
     */
    void delete(T t);

    /**
     * 通过主键删除
     *
     * @param id
     */
    void delete(long id);

    /**
     * 通过criteria转换的map查询分页
     * @param filters
     * @param pageParam
     * @return
     */
    Page<T> findPage(Map<String, Object> filters, PageParam pageParam);

    /**
     * 通过criteria查询分页
     * @param criteria
     * @param pageParam
     * @return
     */
    Page<T> findPageByCriteria(Criteria criteria, PageParam pageParam) throws Exception;

    /**
     * 通过criteria查询分页,且查询的无分页(所有符合条件)
     * @param criteria
     * @return
     */
    List<T> findListByCriteria(Criteria criteria);

    /**
     * 通过criteria查询分页,且查询的无分页(所有符合条件),map通过createCriteria转换
     * @param params
     * @return
     */
    List<T> findListByCriteria(Map<String,Object> params);

    /**
     * 通过map转换criteria查询(用于controller传入参数查询)
     * @param params
     * @param pageParam
     * @return
     * @throws Exception
     */
    Page<T> findPageByCriteria(Map<String,Object> params, PageParam pageParam) throws Exception;

    /**
     * 通过实体类查询分页
     * @param t
     * @param pageParam
     * @return
     */
    Page<T> findPage(T t, PageParam pageParam);

    /**
     * 通过键值对查找
     *
     * @param key
     * @param value
     * @return
     */
    List<T> findByUnique(String key, String value);

    /**
     * 通过键值对查找,并取出第一个值(用于非数据库主键的业务逻辑主键,比如用户名)
     *
     * @param key
     * @param value
     * @return
     */
    T findByUniqueForOne(String key, String value);
}
